package com.example.a_lambda;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamTest {
    public static void main(String[] args) {
//        1、stream中的foreach方法使用
        foreachMethods();

//        2、计数count
        streamCount();

//        3、进行过滤
        streamFilter();


    }

    public static void streamCount() {
        ArrayList<String> list = new ArrayList<>();
        list.add("小明");
        list.add("小军");
        list.add("小张");
        list.add("张无忌");
        list.add("赵敏");
        long count = list.stream().count();
        System.out.println("list的长度是：" + count);

        System.out.println("跨越过两个元素进行读取");
        list.stream().skip(2).forEach(System.out::println);
        System.out.println("只读取前两个元素");
        list.stream().limit(2).forEach(System.out::println);
        System.out.println("使用concat连接两个stream元素");
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("小李");
        Stream.concat(list.stream(), list1.stream()).forEach(System.out::println);

        System.out.println("将stream流变成集合");
        List<Integer> list2 = Stream.of(1, 2, 44, 43).toList();
        List<Integer> collect = Stream.of(1, 2, 44, 43).collect(Collectors.toList());
        System.out.println("转换后的集合collect是：" + collect);
        System.out.println("转换后的集合list2是：" + list2);
    }

    public static void streamFilter() {
        ArrayList<String> list = new ArrayList<>();
        list.add("小明");
        list.add("小军");
        list.add("张军");
        list.add("小张");
        list.add("小张");
        list.stream().filter(s ->
                        s.contains("军")
                ).
                forEach(System.out::println);

        System.out.println("=================使用distinct进行过滤重复值=================");
        list.stream().distinct().forEach(System.out::println);
        ArrayList<Person> personList = new ArrayList<>();
        personList.add(new Person("小明", 18));
        personList.add(new Person("小金", 18));
        personList.add(new Person("小金", 18));
        personList.add(new Person("小找", 18));
//        需要在Person类中，重写hashCode和equals方法
        personList.stream().distinct().forEach(System.out::println);

        System.out.println("使用map进行类型转换");
//        类型转换
        Stream<Integer> integerStream = Stream.of(1, 33, 23, 32);
        integerStream.map(integer ->
                "" + integer
        ).forEach(System.out::println);
    }

    public static void foreachMethods() {
//        使用stram进行list遍历
        ArrayList<String> list = new ArrayList<>();
        list.add("小明");
        list.add("小军");
        list.add("小张");
        list.stream().forEach(System.out::println);

        System.out.println("===============使用stream进行数组遍历===============");
        //        将数组转为stream流，使用的是stream.of
        Stream<Integer> integerStream = Stream.of(1, 2, 34, 43);

        integerStream.forEach(integer ->
                System.out.println(integer)
        );
    }
}
